package com.wxy.learn.oop.animal;

/**
 * 运行方法
 *
 * @author wxy
 * @since 2023-01-01
 */
public class AnimalCase1Main {
    public static void main(String[] args) {
        action();

        attribute();
    }

    /**
     * 描述继承或重写的方法
     */
    private static void action() {
        // 调用dog.eat方法
        Dog dog = new Dog();
        // 输出: dog eat meat
        dog.eat();

        // 来个狗多态试试
        Animal animalDog = new Dog();
        // 输出: dog eat meat
        animalDog.eat();

        // 调用cat.eat方法
        Cat cat = new Cat();
        // 输出: cat eat fish
        cat.eat();

        // 来个猫多态试试
        Animal animalCat = new Cat();
        // 输出: cat eat fish
        animalCat.eat();

        /*
        通过上述Dog and Cat, 无论使用父类的引用, 还是子类的引用, 调用的都是子类的eat方法
        那么如何调用父类的方法呢？
        */

        // 调用monkey.eat方法
        Monkey monkey = new Monkey();
        // 输出: animal eat food
        monkey.eat();

        // 来个猴多态试试
        Animal animalMonkey = new Monkey();
        // 输出: animal eat food
        animalMonkey.eat();

        /*
        通过上述描述可知, 如果子类没重写父类的方法, 当调用eat方法时会自动调用父类的方法
        当然, 你还可以通过在子类方法中通过super关键字, 例如: super.eat();
         */
    }

    /**
     * 描述属性使用的方法
     */
    private static void attribute() {
        /*
        下面描述了父类属性的使用, 无论猫、狗、猴子, 人类都给他们起了名字
        如果创建Dog、Cat、Monkey等100种动物, 我们总不能在每一个类都写一个String name属性吧
        这样代码重复, 而且浪费时间, 能少写就少写。
         */

        Dog dog = new Dog();
        dog.setName("狗子");
        // 输出: 狗子
        System.out.println(dog.getName());

        // 狗多态试试
        Animal animalDog = new Dog();
        animalDog.setName("狗子");
        // 输出: 狗子
        System.out.println(animalDog.getName());
    }
}
